﻿using System.Collections.Concurrent;

namespace System.NETool;

/// <summary>
/// 表示固定长度的线程安全的先进先出 (FIFO) 集合。
/// </summary>
/// <param name="limit">初始化具有指定长度限制的队列的新实例</param>
/// <typeparam name="T">队列中包含的元素的类型。</typeparam>
public class ConcurrentLimitedQueue<T>(int limit) : ConcurrentQueue<T>
{
    /// <summary>
    /// 获取或设置队列的最大长度。
    /// </summary>
    public int Limit => limit;

    /// <summary>
    /// 将对象添加到队列的末尾。如果队列已满，则移除队列的头部元素。
    /// </summary>
    /// <param name="item">要添加到队列末尾的对象。</param>
    public new void Enqueue(T item)
    {
        // 如果队列已达到最大长度，则移除队列的头部元素
        while (Count >= Limit)
        {
            TryDequeue(out var _);
        }

        // 将新元素添加到队列末尾
        base.Enqueue(item);
    }
}
